library(openintro)
library(here)
library(tidyverse)
library(tidymodels)
library(pscl)
library(modelr) 
library(ggplot2)
library(scales)
library(plotly)


theme_set(theme_bw())

knitr::opts_chunk$set(tidy = FALSE,
                      fig.width = 6,
                      fig.height = 5
                      )

BTS é um grupo sul-coreano formado pela BigHit Entertainment, desde seu debut em 2013 foram lançados diversos álbuns que compõem sua carreira, incluindo álbuns com versões em japonês e alguns singles em inglês lançados recentemente. Para a análise de músicas e álbuns do grupo, foram coletados os seus dados disponíveis no Spotify referentes aos lançamentos dos anos de 2013-2021, utilizando-se informações sobre o nome dos álbuns, o título das músicas, suas posições, suas datas de lançamento, a popularidade das músicas, a duração de cada uma, o quanto são dançaveis e a valência. Para mais informações sobre os dados e sua coleta acesse https://spotipy.readthedocs.io/en/2.12.0/, https://developer.spotify.com/documentation/web-api/.

Informações sobre os dados utilizados:

album1 = read_csv("musicas2.csv",
    col_types = cols(
        .default = col_double(),
        album = col_character(),
        track_number = col_integer(),
        name = col_character(),
        popularity = col_integer(),
        duration_ms = col_integer(),
        danceability = col_double(),
        valence = col_double(),
        release_date = col_date(format = "")
    )
)


glimpse(album1)
## Rows: 240
## Columns: 8
## $ album        <chr> "BE", "BE", "BE", "BE", "BE", "BE", "BE", "BE", "MAP OF T~
## $ track_number <int> 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11~
## $ name         <chr> "Life Goes On", "Fly To My Room", "Blue & Grey", "Skit", ~
## $ popularity   <int> 82, 74, 76, 57, 75, 73, 74, 87, 54, 72, 56, 52, 50, 52, 5~
## $ duration_ms  <int> 207481, 222242, 254950, 179547, 202313, 239722, 204800, 1~
## $ danceability <dbl> 0.566, 0.764, 0.547, 0.703, 0.787, 0.731, 0.582, 0.746, 0~
## $ valence      <dbl> 0.4500, 0.5880, 0.3640, 0.5440, 0.5700, 0.4840, 0.3410, 0~
## $ release_date <date> 2020-11-20, 2020-11-20, 2020-11-20, 2020-11-20, 2020-11-~

Album - Nome do albúm

Track Number - Posição da música no albúm

Name - Nome da música

Popularity - Popularidade da música entre 0 e 100 baseando-se no número total de reproduções que a faixa teve e quão recentes foram estas reproduções

Duration MS - Duração da música em mílisegundos

Danceability - Descreve com valores de 0 a 1 o quanto a música é dançavel baseado em estabilidade de ritmo, batida e regularidade

Valence - Descreve com valores 0 a 1 o humor da música, com alta valência significando humor mais alegre e baixa valência humor mais triste

Release Date - Data de lançamento da música

Explorando um pouco os dados dos álbuns:

Distribuição da média da popularidade dos álbuns:

pop_album = album1 %>%
    group_by(album) %>%
    summarise(popularity = mean(popularity),
              .groups = "drop")
  
pop_album$album <- factor(as.character(pop_album$album), levels = pop_album$album[order(pop_album$popularity)])

ggplot(pop_album, aes(y = album, x = popularity))+  
geom_bar(stat = "identity", width = 0.25, color = "steelblue")+
labs(
    x = "Popularidade",
    y = "Álbum"
)

Distribuição da duração dos álbuns:

duration = album1 %>%
    group_by(album) %>%
    summarise(duration_ms = sum(duration_ms),
              .groups = "drop")
  
duration$album <- factor(as.character(duration$album), levels = duration$album[order(duration$duration_ms)])

ggplot(duration, aes(y = album, x = sqrt(duration_ms)))+  
geom_bar(stat = "identity", width = 0.25, color = "steelblue")+
labs(
    x = "Duração(sqrt(ms))",
    y = "Álbum"
)

Distribuição da data de lançamento dos álbuns:

release = album1 %>%
    group_by(album) 
  
release$album <- factor(as.character(release$album), levels = unique(release$album[order(release$release_date)]))

ggplot(release, aes(y = album, x = release_date))+  
geom_point(size = 2, color = "steelblue")+
labs(
    x = "Data de lançamento",
    y = "Álbum"
)

Para esta análise deseja-se responder algumas perguntas:

  • Qual a música mais popular de cada albúm? E a mais popular no geral?

  • A popularidade das músicas tem relação com sua posição no álbum?

  • A data de lançamento dos álbuns tem relação com sua popularidade?

  • Qual a relação entre a dançabilidade de uma música e seu humor?

  • Qual a relação entre a dançabilidade, duração e humor de uma música com sua popularidade?

A popularidade das músicas tem relação com sua posição no álbum?

# Como só existe um single em "Butter (feat. Megan Thee Stallion)", ele não será levado em consideração     

relacao = album1 %>% 
    filter(album != "Butter (feat. Megan Thee Stallion)") %>% 
    select(popularity, track_number, album)
relacao %>% 
    ggplot(aes(y = popularity, x = track_number)) + 
    facet_wrap(~ album, ncol = 3) +
    theme_bw() +
    theme(strip.text = element_text(size = rel(0.52))) +
    geom_point(alpha = 5, size = 1, colour="salmon") +
    labs(
        y = "Popularidade",
        x = "Posição da faixa"
    )

relacao = album1 %>% 
    filter(album != "Butter (feat. Megan Thee Stallion)") %>% 
    select(popularity, track_number, album)


relacao %>% 
    group_by(album) %>% 
    summarise(pearson = cor(track_number, popularity,
                                 method = "pearson"),
              spearman = cor(track_number, popularity, method = "spearman"),
               kendall = cor(track_number, popularity, method = "kendall"),
              
              .groups = "drop")
## # A tibble: 23 x 4
##    album                                pearson spearman kendall
##    <chr>                                  <dbl>    <dbl>   <dbl>
##  1 2 COOL 4 SKOOL                      -0.00619   0.0360  0.0976
##  2 BE                                   0.148    -0.0120 -0.0364
##  3 Dark & Wild                         -0.186    -0.0132 -0.0447
##  4 FACE YOURSELF                        0.463     0.518   0.350 
##  5 LOVE YOURSELF 'Her'                  1         1       1     
##  6 Love Yourself 'Tear'                 0.0770    0.1     0     
##  7 LOVE YOURSELF  'Her'                -0.640    -0.630  -0.514 
##  8 Love Yourself  'Tear'               -0.798    -0.899  -0.828 
##  9 MAP OF THE SOUL : 7                  0.650     0.582   0.387 
## 10 MAP OF THE SOUL : 7 ~ THE JOURNEY ~  0.114    -0.0942 -0.0663
## # ... with 13 more rows

Para esta pergunta foi avaliada a correlação entre a variável popularidade e posição da faixa no álbum, observando-se então que o formato da correlação dos dados no gráfico não é exatamente linear, apenas em Permission to Dance que este padrão pode ser observado mais claramente, não sendo possível detectar se existe alguma correlação entre a popularidade de uma faixa e sua posição no álbum.

Com a análise dos coeficiente de correlação, é possível observar que existe uma correlação entre a popularidade e a posição das faixas, porém esta variando entre negativa e positiva e relativamente fraca, com algumas excessões. Alguns álbuns apresentam uma correlação mais forte, como no caso de MAP OF THE SOUL: 7 e You Never Walk Alone que a popularidade aumenta na medida que o número da faixa cresce, e no caso de LOVE YOURSELF: HER e Permission to Dance que a popularidade diminui na medida que o número da faixa cresce.

A data de lançamento dos álbuns tem relação com sua popularidade?

relacao1 = album1 %>% 
    select(popularity, release_date, album) %>%
    group_by(album) %>%
    mutate(popularity = trunc(mean(popularity))) %>%
    ungroup() 
        
rd = relacao1 %>% 
        ggplot(aes(y = popularity, x = release_date, color = album)) + 
        geom_point(data = relacao1, aes(x = release_date)) +
        theme(legend.position="none") +
        geom_point(size = 3) +
        labs(
           y = "Popularidade",
            x = "Data de lançamento"
        )

ggplotly(rd)
rel = relacao1 %>%
  select(popularity, release_date)

model <- lm(popularity ~ release_date, 
           data = rel)

tidy(model, conf.int = T)
## # A tibble: 2 x 7
##   term          estimate std.error statistic  p.value  conf.low conf.high
##   <chr>            <dbl>     <dbl>     <dbl>    <dbl>     <dbl>     <dbl>
## 1 (Intercept)  -68.8     14.4          -4.78 3.08e- 6 -97.2     -40.5    
## 2 release_date   0.00682  0.000836      8.16 1.98e-14   0.00517   0.00847
glance(model)
## # A tibble: 1 x 12
##   r.squared adj.r.squared sigma statistic  p.value    df logLik   AIC   BIC
##       <dbl>         <dbl> <dbl>     <dbl>    <dbl> <dbl>  <dbl> <dbl> <dbl>
## 1     0.218         0.215  10.5      66.5 1.98e-14     1  -903. 1812. 1822.
## # ... with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>

Analisando a relação entre a data de lançamento de um álbum e sua popularidade, e utilizando um modelo no formato popularity = -68.4 + 0.006 x release_date a explicação da variância de resposta foi de 21,78% (R^2 = 0.2178). O crescimento na data de lançamento de um álbum produz um aumento de 0.006 (IC 95% [0.005; 0.008]) no valor esperado da taxa de resposta. O efeito parece ser pouco relevante visto que o valor de acréscimo é baixo, logo, a data de lançamento de um álbum tem alguma relação com sua popularidade, porém sendo esta pequena.

Qual a relação entre a dançabilidade de uma música e seu humor?

danc = album1 %>%
  filter(valence != 0 & danceability != 0) %>%
  select(valence, danceability)

danc %>% 
    ggplot(aes(x = valence, y = log(danceability))) + 
    geom_point(color = "purple", size = 2, alpha = .8) +
    labs (
      x = "Humor(valência)",
      y = "Dançabilidade"
    )

# dançabilidade = b0 + b1*valencia


model1 = lm(danceability ~ valence, 
           data = danc)


tidy(model1, conf.int = T)
## # A tibble: 2 x 7
##   term        estimate std.error statistic  p.value conf.low conf.high
##   <chr>          <dbl>     <dbl>     <dbl>    <dbl>    <dbl>     <dbl>
## 1 (Intercept)    0.479    0.0198     24.2  6.08e-66    0.440     0.518
## 2 valence        0.229    0.0343      6.68 1.65e-10    0.162     0.297
glance(model1)
## # A tibble: 1 x 12
##   r.squared adj.r.squared sigma statistic  p.value    df logLik   AIC   BIC
##       <dbl>         <dbl> <dbl>     <dbl>    <dbl> <dbl>  <dbl> <dbl> <dbl>
## 1     0.159         0.155 0.107      44.7 1.65e-10     1   196. -386. -375.
## # ... with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>

A Regressão linear simples foi utilizada para analisar a relação entre a dançabilidade de uma música e seu humor. Um modelo no formato danceability = 0.47 + 0.22 x valence explica 15.86% da variância da variável de resposta (R^2 = 0.1586). O aumento de 1% no humor de uma música produz um aumento de 0.22 (IC 95% [0.16; 0.29]) no valor esperado da taxa de resposta. O efeito observado é relevante, visto que o valor de acréscimo é relativamente alto. Logo, é provável que o humor de uma música afete e tenha uma relação com sua dançabilidade.

Qual a relação entre a dançabilidade, duração e humor de uma música com sua popularidade?

album1 %>% 
    ggplot(mapping = aes(x = popularity, y = danceability))+  
    geom_col(fill = "steelblue", alpha = 0.75)+
    labs(
        x = "Popularidade",
        y = "Dançabilidade"
    )

album1 %>% 
    ggplot(mapping = aes(x = popularity, y = valence))+  
    geom_col(fill = "steelblue", alpha = 0.75)+
    labs(
        x = "Popularidade",
        y = "Humor"
    )

album1 %>% 
    ggplot(mapping = aes(x = popularity, y = log(duration_ms)))+  
    geom_col(fill = "steelblue", alpha = 0.75)+
    labs(
        x = "Popularidade",
        y = "log(Duração)"
    )

m1 = lm(popularity ~ valence + log(duration_ms) + danceability, 
          data = album1
        )

tidy(m1, conf.int = T) 
## # A tibble: 4 x 7
##   term             estimate std.error statistic   p.value conf.low conf.high
##   <chr>               <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
## 1 (Intercept)         -92.7     33.9      -2.74 0.00668    -159.      -26.0 
## 2 valence             -10.4      4.73     -2.20 0.0287      -19.7      -1.09
## 3 log(duration_ms)     11.4      2.77      4.10 0.0000559     5.91     16.8 
## 4 danceability         13.3      7.80      1.71 0.0887       -2.03     28.7
glance(m1)
## # A tibble: 1 x 12
##   r.squared adj.r.squared sigma statistic  p.value    df logLik   AIC   BIC
##       <dbl>         <dbl> <dbl>     <dbl>    <dbl> <dbl>  <dbl> <dbl> <dbl>
## 1    0.0796        0.0679  13.4      6.81 0.000203     3  -961. 1932. 1950.
## # ... with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>

Utilizando Regressão linear múltipla, um modelo no formato popularity = -92.6 -10.39xvalence + 11.35xlog(duration_ms) + 13.34xdanceability explica 7.96% da variância da variável de resposta (R^2 = 0.0796). O aumento de 1% das variáveis de explicação produz um decremento de 10.39 no valor da valência (IC 95% [-19.7; -1.08]) mais um aumento de 11.35 no valor do log da duração (IC 95% [5.9; 16.8]), mais um aumento de 13.34 na dançabilidade (IC 95% [-2.03; 28.71]), no valor esperado da popularidade.

A dançabilidade, a valência e o humor de uma música podem ter algum efeito sobre a popularidade desta, porém como seus valores de confiança variam muito e os de dançabilidade assumem valores negativos e positivos, os efeitos dessas variáveis podem ser inconclusivos ou terem efeitos de baixo à médio com alguma relevância.